from django import http
from random import randint
from django.views import View
from meiduo_mall.libs.captcha.captcha import captcha
from django_redis import get_redis_connection
from meiduo_mall.utils.response_code import RETCODE
import logging

from . import constants
from celery_tasks.sms.tasks import send_sms_code
logger = logging.getLogger('django')
# 定义验证码的视图
class ImageCodeView(View):
    def get(self, request, uuid):
        # 生成SDK图形校验码
        name, text, image_bytes = captcha.generate_captcha()
        # 创建redis连接
        redis_conn = get_redis_connection('verify_code')

        redis_conn.setex(uuid, 300, text)

        return http.HttpResponse(image_bytes, content_type='image/png')

class SMSCodeView(View):
    # 短信验证码
    def get(self, request, mobile):

        # 这里的逻辑是需要图形验证码之前的数字，不然无法进行对比
        redis_conn = get_redis_connection('verify_code')  # 创建连接对象,先创建连接对象才能够使用

        send_flag = redis_conn.get('send_flag_%s' % mobile)

        if send_flag:
            return http.JsonResponse({'code': RETCODE.THROTTLINGERR, 'errmsg': '请勿频繁发送短信'})

        # 接受参数
        image_code_client = request.GET.get('image_code')
        uuid = request.GET.get('uuid')

        # 校验参数
        if all([image_code_client, uuid])is False:
            return http.JsonResponse({'code': RETCODE.NECESSARYPARAMERR, 'errmsg': '缺少必传参数'})
        # 这里的逻辑是需要图形验证码校验之前的数字，不然无法进行对比

        image_code_server = redis_conn.get(uuid) # 提取redis图形验证码的uuid

        # 进行判断存在与否或者是否过期
        if image_code_server is None:
            return http.JsonResponse({'code': RETCODE.IMAGECODEERR, 'errmsg': '图形验证码已过期'})
        redis_conn.delete(uuid)  # 删除图形验证码redis保证它是一次性的

        # 判断输入的图形验证码是否正确
        if image_code_client.lower() != image_code_server.decode().lower():
            return http.JsonResponse({'code': RETCODE.IMAGECODEERR, 'errmsag': '输入的图形验证码错误'})

        # 生成短信验证码
        sms_code = '%06d' % randint(0, 999999)
        logger.info(sms_code)

        pl = redis_conn.pipeline()  # 管道/把多任务扔到管道里执行，使执行效率变快
        # 保存短信验证码
        pl.setex('sms_code_%s' % mobile, constants.IMAGE_CODE_EXPIRE_REDIS, sms_code)
        # 发送短信后向redis存储一个此手机发过的标记
        pl.setex('send_fiag_%s' % mobile, 60, 1)
        # 一定要执行下面，不然会一直在管道里堆积
        pl.execute()

        # 发短信
       # CCP().send_template_sms(mobile, [sms_dode, constants.IMAGE_CODE_EXPIRE_REDIS // 60], 1)
        send_sms_code.delay(mobile, sms_code)

        return http.JsonResponse({'code': RETCODE.OK, 'errmsg': 'ok'})
